package classLoader;

import com.sun.crypto.provider.DESKeyFactory;
import sun.misc.Launcher;

import java.net.URL;

/**
 * @author Jamie Nie
 * @title: TestJDKClassLoader
 * @projectName jvm-exercise
 * @Slogan: The harder you work, the more luck you have.
 * @date 2021/6/19 0019 23:35
 * @description: 类加载过程主要是通过类加载器来实现的，Java里有如下几种类加载器:
 * 引导类加载器(bootStrapLoader)：负责加载支撑JVM运行的位于JRE的lib目录下的核心类库，比如rt.jar、charsets.jar等
 * 扩展类加载器(extClassLoader)：负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包
 * 应用程序类加载器(appClassLoader)：负责加载ClassPath路径下的类包，主要就是加载你自己写的那些类
 * 自定义加载器：负责加载用户自定义路径下的类包
 */
public class TestJDKClassLoader {
    public static void main(String[] args) {
        System.out.println("----------类加载器---------");
        System.out.println(String.class.getClassLoader());
        System.out.println(DESKeyFactory.class.getClassLoader().getClass().getName());
        System.out.println(TestJDKClassLoader.class.getClassLoader().getClass().getName());
        System.out.println();

        System.out.println("-----------类加载器的父子关系（表示的是加载器的关系而不是类的关系）------------");
        ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();
        ClassLoader extClassLoader = appClassLoader.getParent();
        ClassLoader bootStrapLoader = extClassLoader.getParent();
        System.out.println("bootStrapLoader = " + bootStrapLoader);
        System.out.println("extClassLoader = " + extClassLoader);
        System.out.println("appClassLoader = " + appClassLoader);
        System.out.println();

        System.out.println("----------不同类加载器加载的文件----------");
        System.out.println("BootstrapLoader加载以下文件：");
        URL[] urls = Launcher.getBootstrapClassPath().getURLs();
        for (int i=0;i<urls.length;i++){
            System.out.println(urls[i]);
        }
        System.out.println();
        System.out.println("ExtClassLoader加载以下文件");
        System.out.println(System.getProperty("java.ext.dirs"));
        System.out.println();
        System.out.println("AppClassLoader加载以下文件");
        System.out.println(System.getProperty("java.class.path"));

    }
}
